// 使用class关键字定义一个类

/**
 * 对象主要包含两个部分：
 *  1. 属性：描述对象的特征
 *  2. 方法：对象具备的行为
 * 
 * */ 

class Person {
    /**
     * 
     * 直接定义属性时实例属性，需要通过对象的实例去访问
     *    const person = new Person();
     *    person.name
     * 
     * 使用static关键字定义的属性是静态属性（类属性），可以直接通过类去访问
     *    Person.age
     * 
     * readonly关键字定义只读属性，只读属性必须在声明时或构造函数里被初始化
     * 
     * */ 

    // 定义实例属性
    name: string = '张三';
    

    // 在属性前使用static关键字，定义静态属性
    static age: number = 18;

    // 使用readonly关键字定义只读属性
    readonly height: number = 180;

    // 定义方法
    /**
     * 如果方法以static关键字开头，表示该方法是一个静态方法
     * 静态方法不需要创建实例，可以直接通过类去调用
     * 
     * */ 
    sayHello() {
        console.log('Hello, TypeScript!');
    }
}

// 创建一个Person类的实例
const person = new Person();
console.log(person.name); // 张三
person.name = '李四';
console.log(person.name); // 李四

// 访问静态属性
console.log(Person.age); // 18、
Person.age = 20;
console.log(Person.age); // 20

// 访问只读属性
console.log(person.height); // 180
// person.height = 190; // Cannot assign to 'height' because it is a read-only property.ts(2540)

// 调用方法
person.sayHello(); // Hello, TypeScript!